package fr.upstlse.glre.client.administration.communiquer.action;

import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;

import fr.upstlse.glre.client.administration.communiquer.Communiquer;
import fr.upstlse.glre.client.espacededie.commun.utilisateur.action.IUserSelectionAction;
import fr.upstlse.glre.client.utilitaires.ControlerUtil;
import fr.upstlse.glre.client.vo.user.EtudiantVOGWT;
import fr.upstlse.glre.client.vo.user.ProfesseurVOGWT;
import fr.upstlse.glre.client.vo.user.UserRoleVOGWT;
import fr.upstlse.glre.client.vo.user.UserVOGWT;
import fr.upstlse.glre.client.widgets.modelData.UserModelData;

public class AdminUserSelectionAction implements IUserSelectionAction {

	public void handleEvent(ComponentEvent be) {
		ModelData lModelData = Communiquer.getInstance().getListeUserPanel()
				.getSelectedItem().getModel();
		if (lModelData instanceof UserModelData) {
			Info.display("Information", "Utilisateur sélectionné", "");
			UserModelData lUserModelData = new UserModelData(lModelData);
			UserVOGWT lUserVOGWT = lUserModelData.toUserVOGWT();

			final Window lWindow = new Window();

			if (lUserVOGWT.getRole().equals(UserRoleVOGWT.ADMIN.getValue())) {
				lWindow.add(lUserVOGWT.getHtml());
				lWindow.show();
			} else if (lUserVOGWT.getRole().equals(UserRoleVOGWT.ETUDIANT.getValue())) {
				final MessageBox lWaitMessageBox = MessageBox.wait(
						"Information",
						"Chargement des informations de l'étudiant ",
						"chargement en cours...");
				AsyncCallback<EtudiantVOGWT> lCallback = new AsyncCallback<EtudiantVOGWT>() {
					public void onFailure(Throwable pCaught) {
						lWaitMessageBox.hide();
						MessageBox.alert("Erreur getEtudiant ", pCaught
								.getMessage(), null);
					}

					public void onSuccess(EtudiantVOGWT pResult) {
						lWaitMessageBox.hide();
						EtudiantVOGWT lEtudiantVOGWT = pResult;
						Info.display("Information",
								"Étudiant chargé avec succès", "");
						lWindow.add(lEtudiantVOGWT.getHtml());
						lWindow.show();
					}
				};
				ControlerUtil.getUserControlerServiceAsyncInstance()
						.getEtudiantById(lUserVOGWT.getId(), lCallback);
			} else if (lUserVOGWT.getRole().equals(
					UserRoleVOGWT.PROFESSEUR.getValue())) {
				final MessageBox lWaitMessageBox = MessageBox.wait(
						"Information",
						"Chargement des informations du professeur ",
						"chargement en cours...");
				AsyncCallback<ProfesseurVOGWT> lCallback = new AsyncCallback<ProfesseurVOGWT>() {
					public void onFailure(Throwable pCaught) {
						lWaitMessageBox.hide();
						MessageBox.alert("Erreur getProfesseur ", pCaught
								.getMessage(), null);
					}

					public void onSuccess(ProfesseurVOGWT pResult) {
						lWaitMessageBox.hide();
						ProfesseurVOGWT lProfesseurVOGWT = (ProfesseurVOGWT) pResult;
						Info.display("Information",
								"Professeur chargé avec succès", "");
						lWindow.add(lProfesseurVOGWT.getHtml());
						lWindow.show();
					}
				};
				ControlerUtil.getUserControlerServiceAsyncInstance()
						.getProfesseurById(lUserVOGWT.getId(), lCallback);
			} else {
				MessageBox.alert("Erreur", "Role non pris en charge ("
						+ lUserVOGWT.getRole() + ")", null);
			}
		}
	}
}
